package chatRoom.com.fenwe.util.treeIterate;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 
* 项目名称:  SPMS需求管理
* 包:        com.migu.spms.utils.treeIterate 
* 类名称:    IterateUtil.java
* 类描述:    树形结构数据遍历工具工具类
* 创建人:    fw  
* 创建时间:  2017年6月27日 上午10:20:14
 */
public class IterateUtil {
    /**
     * @Description 树形结构数据遍历方法（要求第一次的查询入参存入parentEntity中）
     * @param parentEntity 根类型实体
     * @param queryService 查询接口（这里只声明接口，需实现queryById方法，推荐用匿名类实现）
     * @param idColumn 查询入参字段名
     * @param memberColumn 集合字段名（要求为字段类型为list）
     * @return 每一层封装后的根实体
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     * @throws NoSuchFieldException
     * @throws SecurityException
     */
    public static <T> T iterateAsTree(T parentEntity, QueryService<T> queryService, String idColumn,
            String memberColumn)
            throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
        Class<?> clazz = parentEntity.getClass();
        Field idField = clazz.getDeclaredField(idColumn);
        idField.setAccessible(true);
        if (null == idField.get(parentEntity)) {
            return null;
        }
        List<T> list = (List<T>) queryService.queryById((Long) idField.get(parentEntity));
        if (null != list && list.size() > 0) {
            List<T> member = new ArrayList<T>();
            Field field = clazz.getDeclaredField(memberColumn);
            field.setAccessible(true);
            field.set(parentEntity, member);
            for (T temp : list) {
                member.add(temp);
                iterateAsTree(temp, queryService, idColumn, memberColumn);
            }
        }
        return parentEntity;
    }

    /**
     * @Description 查询树形结构，返回为列表 （要求第一次的查询入参存入parentEntity中）
     * @param parentEntity 根类型实体
     * @param queryService 查询接口（这里只声明接口，需实现queryById方法，推荐用匿名类实现）
     * @param idColumn 查询入参字段名
     * @param resultList 包装结果的列表
     * @return 每一层装入数据后的列表
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     * @throws NoSuchFieldException
     * @throws SecurityException
     */
    public static <T> List<T> iterateAsList(T parentEntity, QueryService<T> queryService, String idColumn,
            List<T> resultList)
            throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
        Class<?> clazz = parentEntity.getClass();
        Field idField = clazz.getDeclaredField(idColumn);
        idField.setAccessible(true);
        if (null == idField.get(parentEntity)) {
            return null;
        }
        List<T> list = (List<T>) queryService.queryById((Long) idField.get(parentEntity));
        if (null != list && list.size() > 0) {
            for (T temp : list) {
                resultList.add(temp);
                iterateAsList(temp, queryService, idColumn, resultList);
            }
        }
        return resultList;
    }
}
